package org.example.primary;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * @author zhaokuii11@163.com
 * @create 2021-12-06 14:59
 * @Description
 */
public class Demo1 {
    private SessionFactory sessionFactory;//会话工厂
    private Session session;//会话
    private Transaction transaction;//事务

    @Before //juint测试方法 之前执行
    public void init() {
        System.out.println("init");
        //1. 根据 Configuration创建 会话工厂
        sessionFactory = new Configuration().configure().buildSessionFactory();
        //2. 创建 会话
        session = sessionFactory.openSession();
        //3. 创建事务
        transaction = session.beginTransaction();
    }

    @Test
    public void testGet2() {
        //在查询没有外键的实体对象时，使用左外连接，一并查询出其关联的对象
        //并已经进行初始化【这里不需要使用 property-ref，使用报错】
        Manager manager = session.get(Manager.class, 1);
        System.out.println(manager.getMgrName());
        System.out.println(manager.getDept().getDeptName());
    }

    @Test
    public void testGet() {
        //1. 默认情况下对关联属性使用懒加载
        //2. 所以会出现懒加载异常的问题。【session关闭后使用 对象属性】
        Department department = session.get(Department.class, 1);
        System.out.println(department.getDeptName());
        Manager mgr = department.getMgr();
        System.out.println(mgr.getMgrName());
    }


    @Test
    public void testSave() {
        //设置关联关系
        Department department = new Department(null, "dept-CC");
        Manager manager = new Manager(null, "mgr-CC", department);
        department.setMgr(manager);
        //保存 两个insert  前 manager 后 department
        session.save(department);
        session.save(manager);
        //两个 insert 先 manager 后 department
        //session.save(manager);
        //session.save(department);
        //主键列不能为空，只能等 manager插入之后再插入 department，所以先插入哪一个都不会有问题
    }


    @After//juint测试方法 之后执行
    public void destroy() {
        //先开后关
        System.out.println("destroy");
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
}
